package vetxsoft.bean;

import java.io.Serializable;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import vetxsoft.entity.DetalleVenta;
import vetxsoft.entity.DetalleVentaPK;
import vetxsoft.entity.Factura;
import vetxsoft.system.IVetexsoftSystem;

/**
 *
 * @author Fary Hurtado <hurtadofary@gmail.com>
 */
@ManagedBean
@SessionScoped
public class VentaBean implements Serializable {

    @EJB
    private IVetexsoftSystem vetexsoftSystem;
    private Date currentDate = new Date();
    private Factura factura = new Factura();
    private DetalleVenta detalleVenta = new DetalleVenta();
    private LinkedList<DetalleVenta> detalleVentas = new LinkedList<DetalleVenta>();
    private boolean stored = false;

    public VentaBean() {
    }

    public Date getCurrentDate() {
        return currentDate;
    }

    public Factura getFactura() {
        return factura;
    }

    public void setFactura(Factura factura) {
        this.factura = factura;
    }

    public DetalleVenta getDetalleVenta() {
        return detalleVenta;
    }

    public LinkedList<DetalleVenta> getDetalleVentas() {
        return detalleVentas;
    }

    public void setDetalleVenta(DetalleVenta detalleVenta) {
        this.detalleVenta = detalleVenta;
    }

    public boolean isStored() {
        return stored;
    }

    public void setStored(boolean stored) {
        this.stored = stored;
    }

    public IVetexsoftSystem getVetexsoftSystem() {
        return vetexsoftSystem;
    }

    public void cancelSelectionCliente() {

        this.factura.setCedCliente(null);
    }

    public void cancelSelectionProducto() {

        this.detalleVenta.setProducto(null);
    }

    public void returnDetalle() {


        this.factura.setTotal(this.factura.getTotal() - (this.detalleVenta.getCantidad() * this.detalleVenta.getProducto().getPrecio()));

        this.detalleVentas.remove(detalleVenta);
        this.detalleVenta = new DetalleVenta();

    }

    public void addDetalleAction() {

        if (this.detalleVenta.getCantidad() <= 0) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "La cantidad no puede ser menor o igual a cero.", ""));
            return;
        }

        if (this.detalleVenta.getProducto() == null) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Debes seleccionar una cantidad.", ""));
            return;
        }

        // Calculamos el nuevo total de la factura
        this.factura.setTotal(this.getFactura().getTotal() + this.detalleVenta.getCantidad() * this.detalleVenta.getProducto().getPrecio());

        this.detalleVentas.add(detalleVenta);
        this.detalleVenta = new DetalleVenta();

    }

    public void cancelAction() {

        this.factura = new Factura();
        this.detalleVenta = new DetalleVenta();
        this.detalleVentas = new LinkedList<DetalleVenta>();
        this.stored = false;
    }

    public void saveAction() {
        try {

            if (this.factura.getCedCliente() == null) {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Debes seleccionar un cliente.", ""));
                return;
            }


            if (this.detalleVentas.isEmpty()) {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Debes seleccionar un producto.", ""));
                return;
            }

            // guardamos la factura
            this.factura.setStored(this.stored);
            this.vetexsoftSystem.saveFactura(this.factura);

            // obtenemos la ultima factura guardada, la cual nos proporcionará el codigo generado automaticamente
            List<Factura> facturas = this.vetexsoftSystem.obtenerFacturas();
            this.factura = facturas.get(facturas.size() - 1);


            // guardamos todos los detalles de venta registrados
            for (DetalleVenta dv : this.detalleVentas) {

                dv.setDetalleVentaPK(new DetalleVentaPK(this.factura.getNumero(), dv.getProducto().getCodigo()));
                this.vetexsoftSystem.saveDetalleVenta(dv);
            }

            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "La venta ha sido registrada satisfactoriamente.", ""));

            this.factura = new Factura();
            this.detalleVenta = new DetalleVenta();
            this.detalleVentas = new LinkedList<DetalleVenta>();
            this.stored = false;

        } catch (Exception ex) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "No se ha podido registrar la venta. Por favor, vuelva a intentarlo.", ""));
        }
    }

    public void removeAction() {
        try {

            this.factura.setStored(this.stored);
            this.vetexsoftSystem.removeFactura(this.factura);
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "La venta ha sido eliminada satisfactoriamente.", ""));

            this.factura = new Factura();
            this.stored = false;
            this.detalleVenta = new DetalleVenta();

        } catch (Exception ex) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "No se ha podido eliminar la venta. Por favor, vuelva a intentarlo.", ""));
        }
    }
}
